/**
 * * 自定义工具插件
 * * 以下工具与业务耦合，使用频率远高于tools
 * * 组件内可直接通过this访问
 */
import ajax from './ajax'

/**
 * * 工具函数
 */
function broadcast(componentName, eventName, params) {
  for (const child of this.$children) {
    const name = child.$options.name
    if (name === componentName) {
      child.$emit(eventName, params)
      return
    } else {
      broadcast.apply(child, [componentName, eventName, params])
    }
  }
}

const utils = {}

utils.install = function(Vue, options) {
  /**
   * @description 用于在template中输出数据
   * @param {content} 需要输出的内容
   */
  Vue.prototype.$log = window.console.log

  /**
   * @description 操作成功提示框
   * @author fanzhongxu
   * @param {*} content 提示内容
   */
  Vue.prototype.$alertSuccess = function(content) {
    this.$Message.config({
      top: 70,
      duration: 3,
    })
    this.$Message.success(content || '操作成功')
  }

  /**
   * @description 操作失败提示框
   * @author fanzhongxu
   * @param {*} content 提示内容
   */
  Vue.prototype.$alertError = function(content) {
    this.$Message.config({
      top: 70,
      duration: 3,
    })
    this.$Message.error(content || '操作失败')
  }

  // * 注册ajax工具
  Object.keys(ajax).forEach(key => (Vue.prototype[key] = ajax[key]))

  /**
   * @description（向子组件）单播通信，（目的组件使用$on实例方法监听）
   * @param {*} componentName 子组件名称（必须与name选项一致）
   * @param {*} eventName 事件名称
   * @param {*} params 参数
   */
  Vue.prototype.$unicastToChild = function(componentName, eventName, params) {
    broadcast.call(this, componentName, eventName, params)
  }

  /**
   * @description（向父组件）单播通信（目的组件使用$on实例方法监听）
   * @param {*} componentName 子组件名称（必须与name选项一致）
   * @param {*} eventName 事件名称
   * @param {*} params 参数
   */
  Vue.prototype.$unicastToParent = function(componentName, eventName, params) {
    let parent = this.$parent || this.$root
    let name = parent.$options.name

    while (parent && (!name || name !== componentName)) {
      parent = parent.$parent

      if (parent) name = parent.$options.name
    }
    if (parent && name && name === componentName) {
      parent.$emit(eventName, params)
    }
  }
}

export default utils
